package cn.lcvc.xnc.authority.service;

import cn.lcvc.xnc.authority.model.dto.SysUserAuthority;

/**
 * 专门用于处理用户的token
 */
public interface SysUserTokenService {



    /**
     * 生成用户的token并返回，并保存到redis中
     * 说明：
     * 1.通过jwt生成token（有效期为永久）
     * 2.将token存储到redis中
     * @param userAuthority 对象必须要是从系统中读取
     * @return
     */
    String saveUserToken(SysUserAuthority userAuthority);

    /**
     * 检查token是否合法
     */
    void verifyUserToken(String token);


    /**
     * 检查token是否过期，如果过期抛出异常；如果不过期则刷新该token在redis的时间
     * @param token
     */
    void verifyAndRefreshUserToken(String token);

    /**
     * 从redis中移除用户相应的token
     * 说明：
     * 1.设计规则：根据用户的id在redis中找到用户token并删除。
     * 2.补充：如果前端有多个，注销只影响一个端，则这里需要改为根据token删除
     * @param userAuthority
     */
    void removeUserToken(SysUserAuthority userAuthority);

    /**
     * 从redis中移除token
     * 说明：
     * 1.首先从token中解密获取到对应的userId
     * 2.根据用户的id在redis中找到用户token并删除。
     * 3.补充：如果前端有多个，注销只影响一个端，那么需要设计redis中一个用户根据不同端拥有多个key
     * @param token
     */
    void removeUserToken(String token);

    /**
     * 从token中读取账户名
     * 说明：用于配合其他方法使用
     * @param token
     * @return
     */
    String getUsername(String token);
}
